public class Code1 {
    // 买卖股票的最佳时机含冷冻期
    public int maxProfit(int[] prices) {
        // 1. 创建 dp 表
        // 2. 初始化
        // 3. 填表
        // 4. 返回值

        // 简单分析这里是有三个状态的分别为，买卖、可交易、冷冻期
        // 对此这里就需要创建出一个 三行 的数组，分别对应 0、1、2
        int n = prices.length;
        int[][] dp = new int[n][3];

        // 这里的 i 表示的是第 i 天结束以后所能获取的最大值

        // 进行初始化操作
        // 针对买入的状态，此时就是价格为负的情况
        dp[0][0] = -prices[0];
        // 针对其他的两种情况，在初始情况下对于 price 是没有影响的，此时不进行初始化操作

        //针对填表操作，一次性三行同时填写
        // 在前面已经进行过初始化，此时直接从 1 开始即可
        for(int i = 1; i < n; i++){
            // 对于dp表的第一行进行填表
            // 存在两种可能的情况，前一天到今天什么都不操作，前一天执行可交易操作到达今天
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
            // 针对 dp 表的第二行进行填表
            // 第二行处于的是可交易状态，也存在两种情况，可交易期的前一天到今天不进行操作，前一天为冷冻期不进行操作到今天
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][2]);
            // 针对 dp 表的第三行进行填表操作
            // 第三行处于的是冷冻期，也有两种情况，前一天进行卖出操作加到今天，冷静期当天不进行操作
            // 仔细思考其实就能发现，这里只存在一种情况，即上述的第一条。前一天卖出后肯定是要比当天不进行操作的价值要大
            dp[i][2] = dp[i - 1][0] + prices[i];
        }
        return Math.max(dp[n - 1][1], dp[n - 1][2]);
    }

}
